package com.clei.leetcode;

import com.clei.utils.PrintUtil;

/**
 * 任意子数组和的绝对值的最大值
 * 给你一个整数数组 nums 。一个子数组 [numsl, numsl+1, ..., numsr-1, numsr] 的 和的绝对值 为 abs(numsl + numsl+1 + ... + numsr-1 + numsr) 。
 * <p>
 * 请你找出 nums 中 和的绝对值 最大的任意子数组（可能为空），并返回该 最大值 。
 * <p>
 * abs(x) 定义如下：
 * <p>
 * 如果 x 是负整数，那么 abs(x) = -x 。
 * 如果 x 是非负整数，那么 abs(x) = x 。
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：nums = [1,-3,2,3,-4]
 * 输出：5
 * 解释：子数组 [2,3] 和的绝对值最大，为 abs(2+3) = abs(5) = 5 。
 * 示例 2：
 * <p>
 * 输入：nums = [2,-5,1,-4,3,-2]
 * 输出：8
 * 解释：子数组 [-5,1,-4] 和的绝对值最大，为 abs(-5+1-4) = abs(-8) = 8 。
 *
 * @author KIyA
 */
public class Algorithm1749 {

    public static void main(String[] args) {
        int[] arr = {1, -3, 2, 3, -4};
        PrintUtil.log(maxAbsoluteSum(arr));
    }

    private static int maxAbsoluteSum(int[] nums) {
        int length = nums.length;
        // 最大正值和
        int sum1 = 0;
        // 最大负值和
        int sum2 = 0;
        int max = 0;
        for (int i = 0; i < length; i++) {
            sum1 += nums[i];
            sum2 += nums[i];
            if (sum1 < 0) {
                sum1 = 0;
            }
            if (sum2 > 0) {
                sum2 = 0;
            }
            max = Math.max(Math.max(sum1, Math.abs(sum2)), max);
        }
        return max;
    }
}
